/*
 * Copyright 2016 The Closure Compiler Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'require util/polyfill';

$jscomp.polyfill('Math.log1p', function(orig) {
  if (orig) return orig;

  /**
   * Returns the natural logarithm of 1+x, implemented in a way that is
   * accurate for numbers close to zero.
   *
   * <p>Polyfills the static function Math.log1p().
   *
   * @param {number} x Any number, or value that can be coerced to a number.
   * @return {number} The natural log of 1+x.
   */
  var polyfill = function(x) {
    // This implementation is based on the Taylor expansion
    //   log(1 + x) ~ x - x^2/2 + x^3/3 - x^4/4 + x^5/5 - ...
    x = Number(x);
    if (x < 0.25 && x > -0.25) {
      var y = x;
      var d = 1;
      var z = x;
      var zPrev = 0;
      var s = 1;
      while (zPrev != z) {
        y *= x;
        s *= -1;
        z = (zPrev = z) + s * y / (++d);
      }
      return z;
    }
    return Math.log(1 + x);
  };

  return polyfill;
}, 'es6', 'es3');
